package com.shujia.day12;

import java.util.Comparator;
import java.util.TreeSet;

public class Code14TreeSet {
    public static void main(String[] args) {

        /*
            TreeSet 中添加对象：

                错误提示：
                    com.shujia.day12.Student cannot be cast to java.lang.Comparable
                    当前学生对象不能转换成一个 Comparable 对象 =>
                原因：
                    TreeSet中需要对添加的数据进行比较，但是学生对象中并没有实现其比较的逻辑，没有实现Comparable接口

                记录compareTo重写方法中的返回值：
                    如果返回值固定为0：
                        当返回值固定为0时，那么其结果TreeSet认为都是一样的 所以只存在有一个值

                    如果当返回值为-1：
                        当返回值固定为-1，那么每添加一个数据，就再当前根节点的最左边添加数据，同时取数据时根据中序取值
                            得到和添加顺序相反的结果

                    如果当返回值为1：
                        当返回值固定为1，那么每添加一个数据，就再当前根节点的最右边添加数据，同时取数据时根据中序取值
                            得到和添加顺序相同的结果

                compareTo重写时，
                    1、如果要将结果按升序方式取值，那么需要 拿当前的对象中的属性减去传入对象属性
                    2、对于多个属性进行判断时，要选好先后顺序，中文进行判断时，需要使用字符串中的compareTo进行比较（逻辑需要自行查看源码）



                 @Override
                public int compareTo(Student that) {
                    // 传入的Student和当前Student对象进行比较,其中this表示待插入的学生对象 that表示需要比较的学生对象

                    // 比较逻辑： 先比较年龄 再比较其姓名
                    int ageRes = this.age - that.age;

                    return ageRes == 0 ? this.name.compareTo(that.name): ageRes;
                }

             特点：treeSet底层是一个红黑树，可以自定义元素的顺序，如果要比较两个元素，那么需要重写compareTo方法

             treeSet两种排序方式：
                1、自然排序  创建TreeSet时调用无参构造所使用的排序方式
                2、比较器排序  创建TreeSet时给定Comparator接口的匿名对象并重写其方法

             TreeSet中的add方法底层调用的是 TreeMap中的put方法

         */


        TreeSet<Student> stuTreeSet = new TreeSet<>();

        stuTreeSet.add(new Student("张三",18));
        stuTreeSet.add(new Student("李四",20));
        stuTreeSet.add(new Student("王五",19));
        stuTreeSet.add(new Student("小婉",18));

        System.out.println(stuTreeSet);

        char a = '小';
        char b = '张';
        System.out.println(a - b);


        // TreeSet(Comparator<? super E> comparator)
        // 根据构造方法提示需要传入一个 Comparator 接口的对象 可以使用匿名内部类
        //     对于创建的Comparator接口的匿名内部类对象，如果不添加泛型，那么需要实现equals和compare两个方法
        //     添加 Teacher后，由于继承了Object中的equals方法就不需要再做重写 但是需要再Teacher类中重写equals方法
        TreeSet<Teacher> teacherTreeSet = new TreeSet<>(
                new Comparator<Teacher>() {
                    @Override
                    public int compare(Teacher o1, Teacher o2) {
                        // o1 表示待插入树的教师对象 相当于之前compareTo中的this
                        // o2 表示以插入树的教师对象 相当于之前compareTo中的that
                        int ageRes = o1.age - o2.age;

                        return ageRes == 0 ? o1.name.compareTo(o2.name) : ageRes;
                    }
                }
        );


        teacherTreeSet.add(new Teacher("笑哥",24));
        teacherTreeSet.add(new Teacher("峰峰",22));
        teacherTreeSet.add(new Teacher("童童",18));

        System.out.println(teacherTreeSet);

    }
}
